#ifndef ALARM_RULE_H
#define ALARM_RULE_H

#include <QString>

/**
 * @brief 指标类型枚举
 */
enum MetricTypeEnum
{
    CONTROL_FRAME_TOTAL, ///< 控制帧总数
    CONTROL_POINT_TOTAL, ///< 控制点总数
    SAME_YK_POINT,       ///< 相同遥控点
    SAME_SD_POINT,       ///< 相同设点
    YT_PRECISION,        ///< 遥调精度（%）
    YC_SLOPE             ///< 遥测斜率（%）
};

/**
 * @brief 告警级别枚举
 */
enum AlarmLevelEnum
{
    ALERT,     ///< 提醒
    NOTICE,    ///< 通知
    ATTENTION, ///< 关注
    CRITICAL   ///< 紧急
};

/**
 * @brief 阈值类型枚举
 */
enum ThresholdUnitEnum
{
    PERCENT, // 百分比型
    COUNT    // 数值型
};

/**
 * @brief 告警规则类
 */
class AlarmRule
{
public:
    /**
     * @brief 构造函数
     */
    explicit AlarmRule(MetricTypeEnum metric_type, AlarmLevelEnum alarm_level, ThresholdUnitEnum threshold_unit, int64_t state_id = 0);

    /**
     * @brief 析构函数
     */
    virtual ~AlarmRule();

    /**
     * @brief 获取指标类型
     * @return 指标类型
     */
    MetricTypeEnum metricType() const;

    /**
     * @brief 获取告警级别
     * @return 告警级别
     */
    AlarmLevelEnum alarmLevel() const;

    /**
     * @brief 获取阈值类型
     * @return 阈值类型
     */
    ThresholdUnitEnum thresholdUnit() const;

    /**
     * @brief 获取时间间隔（秒）
     * @return 时间间隔
     */
    int intervalSecs() const;

    /**
     * @brief 设置时间间隔（秒）
     * @param secs 时间间隔
     */
    void setIntervalSecs(int secs);

    /**
     * @brief 获取阈值
     * @return 阈值
     */
    double thresholdValue() const;

    /**
     * @brief 设置阈值
     * @param value 阈值
     */
    void setThresholdValue(double value);

    /**
     * @brief 获取是否启用
     * @return 是否启用
     */
    bool isEnabled() const;

    /**
     * @brief 设置是否启用
     * @param enabled 是否启用
     */
    void setEnabled(bool enabled);

    /**
     * @brief 获取变电站ID
     * @return 变电站ID
     */
    int stateId() const;

    /**
     * @brief 设置变电站ID
     * @param state_id 变电站ID
     */
    void setStateId(int state_id);

    /**
     * @brief 获取告警JSON格式
     * @return 告警JSON格式
     */
    QString toJson() const;

    /**
     * @brief 以富文本方式描述告警规则
     * @return 富文本描述
     */
    QString toRichText() const;

    /**
     * @brief 以文本方式描述告警规则
     * @return 文本描述
     */
    QString toPlainText() const;
    
    

public: // 静态方法
    /**
     * @brief 获取告警级别对应的文本
     * @param level 告警级别
     * @return 告警级别文本
     */
    static QString getAlarmLevelText(AlarmLevelEnum level);

    /**
     * @brief 获取告警级别对应的颜色
     * @param level 告警级别文本
     * @return 颜色代码
     */
    static QString getAlarmLevelColor(const QString &level);

    /**
     * @brief 获取指标类型对应的文本
     * @param type 指标类型
     * @return 指标类型文本
     */
    static QString getMetricTypeText(MetricTypeEnum type);

    /**
     * @brief 从文本获取告警级别枚举值
     * @param text 告警级别文本
     * @return 告警级别枚举值
     */
    static AlarmLevelEnum getAlarmLevelFromText(const QString &text);

    /**
     * @brief 获取告警规则ID
     * @return 告警规则ID
     */
    int id() const;

    /**
     * @brief 设置告警规则ID
     * @param id 告警规则ID
     */
    void setId(int id);

private:
    int id_;                           ///< 告警规则ID
    MetricTypeEnum metric_type_;       ///< 指标类型
    AlarmLevelEnum alarm_level_;       ///< 告警级别
    ThresholdUnitEnum threshold_unit_; ///< 阈值类型
    bool is_enabled_;                  ///< 是否启用
    int interval_secs_;                ///< 间隔时间
    double threshold_value_;           ///< 阈值
    int64_t state_id_;                     ///< 变电站ID
};

#endif // ALARM_RULE_H
